Computers can be considered as combinations of hardware and software components. Computers perform applications to the benefit of human users. For example, computers perform business applications to support business processes in enterprises.
Hardware components are, for example, processors, storage memory devices, random-access memory (RAM) and user interfaces. Software components are, for example, programs and operating systems. The programs are, for example, application programs for the mentioned applications; and operating systems are combinations of input-output drivers, schedulers, virtualization layer and so on.
In a simplified usage-scenario for a program, at design-time, a computer expert (i.e. a programmer) writes the program as a collection of tasks. At deployment-time, the expert deploys the program to the storage memory. At run-time, the processor copies the program to its RAM memory and executes the tasks. The order in which the processor executes the tasks is not statically available at design time; rather, the order develops dynamically in response to, for example, input data, user interaction, or program conditions.
While the above basics remain true for most computers, modern computers can have processors with multiple processing units (e.g., multicore, multiple processors) that share the same RAM, so that some tasks can be executed in parallel. Distributing the tasks to the cores can be challenging: Operating the cores at approximately equal execution load conflicts with spending computation resources to balance the load.